package userInfo

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"sg-backend/global"
	"sg-backend/logger"
	"sg-backend/model/user"
)

type _selfUpdateJson struct {
	Avatar   string `json:"avatar"`
	NickName string `json:"nickName"`
	Gender   uint   `json:"gender"`
	Email    string `json:"email"`
	Mobile   string `json:"mobile"`
}

func SelfUpdate(ctx *fiber.Ctx) error {
	// 解析数据
	var dataDto _selfUpdateJson
	if err := ctx.BodyParser(&dataDto); err != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("数据解释出错！%s", err),
		})
	}

	// 数据解释完毕，开始更新
	userObj := user.User{Id: global.AuthUser.UserId}
	r := global.DB.First(&userObj)
	if r.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "用户对象获取失败！请重试！",
		})
	}

	// 验证手机号码需要唯一
	var users []user.User
	if dataDto.Mobile != "" {
		noDuplicateMobile := global.DB.Where(
			"mobile = ? AND id != ?", dataDto.Mobile, global.AuthUser.UserId,
		).Find(&users)
		if noDuplicateMobile.RowsAffected != 0 {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "此手机号已存在！不允许重复！",
			})
		}
	}

	// 验证邮箱需要唯一
	if dataDto.Email != "" {
		noDuplicateEmail := global.DB.Where(
			"email = ? AND id != ?", dataDto.Mobile, global.AuthUser.UserId,
		).Find(&users)
		if noDuplicateEmail.RowsAffected != 0 {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "此邮箱号已存在！不允许重复！",
			})
		}
	}

	// 更新到数据库
	userObj.Nickname = dataDto.NickName
	userObj.Email = dataDto.Email
	userObj.Mobile = dataDto.Mobile
	userObj.Gender = dataDto.Gender
	userObj.Avatar = dataDto.Avatar
	sr := global.DB.Save(&userObj)
	if sr.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "保存到数据库失败！请重试！",
		})
	}

	// 写日志
	logger.DbInfo(global.AuthUser.Username, fmt.Sprintf("自助修改了用户信息：%+v", dataDto))

	// 返回
	return ctx.JSON(fiber.Map{
		"status":  "done",
		"message": "更新成功！",
	})
}
